package main

import (
	"fmt"
	"reflect"
)

func main() {
	s := Student{}
	s.Eat("鸡蛋")
	s.Sleep(1)
	fmt.Println(reflect.TypeOf(s)) //main.Student

	// 如果要将一个结构体实例赋值给接口类型变量，需要使用指针
	var p Person = &s
	p.Eat("P-鸡蛋")
	p.Sleep(2)
	fmt.Println(reflect.TypeOf(p)) //*main.Student
}

// Person 定义接口，接口是方法的集合
// PS:接口的所有方法必须都实现了，才算是实现了接口，少一个都不行
type Person interface {
	// Eat 吃
	Eat(food string) (bool, error)

	// Sleep 睡觉
	Sleep(hour int) (bool, error)
}

// Student 实现 Person 的所有方法
type Student struct {
}

func (s *Student) Eat(food string) (bool, error) {
	fmt.Println("Eat:", food)
	return true, nil
}

func (s *Student) Sleep(hour int) (bool, error) {
	fmt.Println("Sleep:", hour)
	return true, nil
}
